#include "../header.h"

//1.双进程
//3.消息队列通信

//! 消息队列的双任务 测试
//1 获取或这创建一个消息队列
//2 向消息队列中发送数据
//3 从消息队列中读取数据
//4 销毁消息队列
struct msgbuf
{
    long msgtype;  //消息类型
    char msgtext[512]; //消息内容
};

int main(int argc, char const *argv[])
{
    //准备好消息队列
    //获取键值
    key_t key = ftok("..",50);
    //创建一个消息队列
    int msgid = msgget(key,IPC_CREAT|0600);
    printf("消息队列的id号码:%d\n",msgid);

    //双任务
    pid_t pid = fork();
    if(pid < 0)
        exit(-1);
    //父进程空间
    if(pid > 0)
    {
        // 父进程向消息队列中写数据
        // 类型 + 内容
        struct msgbuf msgstr = {1, "this is msg test parents"};
        // 发送数据
        // 如果消息队列满，立即返回。
        int msgerr = msgsnd(msgid, &msgstr, sizeof(msgstr), IPC_NOWAIT);
        if (msgerr < 0)
        {
            perror("msgsnd error\n");
            return -2;
        }
        wait(NULL);
        msgctl(msgid,IPC_RMID,NULL);
    }
    if (pid == 0)
    {
        // 接收数据
        struct msgbuf msgbuf2 = {0};
        // bug位置。
        char buff[128] = " ";
        int msglen = msgrcv(msgid, &msgbuf2, sizeof(msgbuf2), 1, IPC_NOWAIT);
        printf("子进程读出的数据是: msglen = %d %s\n", msglen, msgbuf2.msgtext);
        /* code */
        printf("this is child process:%d\n",getpid());
    }
    return 0;
}
